﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Windows.Controls;

using System.Text.RegularExpressions;
using System.Diagnostics;

namespace Fotball_01.nifs
{
    class Nifs
    {
        public Nifs()
        {

        }

        /// <summary>
        /// Henter resultater fra 'i dag'. Hele siden blir returnert.
        /// </summary>
        /// <param name="date">Datoen på formen YYYY-MM-DD</param>
        /// <returns>Returnerer hele siden som string</returns>
        public string Idag(string date)
        {
            StringBuilder sb = new StringBuilder();
            byte[] buf = new byte[8192];

            string uri = "http://www.nifs.no/idag.php?dato=" + date;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            Stream resStream = response.GetResponseStream();

            string tempString = null;
            int count = 0;

            do
            {
                count = resStream.Read(buf, 0, buf.Length);

                if (count != 0)
                {
                    tempString = Encoding.Default.GetString(buf, 0, count);
                    sb.Append(tempString);
                }
            }
            while (count > 0);

            return sb.ToString();
        }

        public List<Kamp> KamperIdag(string dato)
        {
            List<Kamp> kamper = new List<Kamp>();
            string page = this.Idag(dato);

            List<List<string>> lag = KamperIdagLag(page);
            List<List<int>> maal = MaalIdag(page);
            List<string> status = StatusIdag(page);

            for (int i = 0; i < status.Count; i++)
            {
                if (status[i].ToUpper().Equals("IKKE SPILT"))
                {
                    // Denne kampen er ikke spilt, den må fjernes for å unngå exception
                    lag.Remove(lag[i]);
                    //maal.Remove(maal[i]);
                    status.Remove(status[i]);
                    
                    i--;
                    continue; // Start på nytt fra samme posisjon med den gitte kampen fjernet
                }

                //box.Text += lag[i][0] + " - " + lag[i][1] + ": ";// Skriv ut lag
                //box.Text += "(" + maal[i][0] + " - " + maal[i][1] + ")";
                //box.Text += " ### " + status[i] + "\n";

                Kamp kamp = new Kamp(lag[i][0], lag[i][1], maal[i][0], maal[i][1], status[i]);
                kamper.Add(kamp);
            }

            return kamper;
        }

        /// <summary>
        /// Henter status fra 'idag' (Spilt/ikke spilt osv.) og legger det i en liste
        /// </summary>
        /// <param name="page">Siden idag</param>
        /// <returns>Liste med stringer med statuser</returns>
        private List<string> StatusIdag(string page)
        {
            List<string> liste = new List<string>();
            StringReader sr = new StringReader(page);

            string pattern = @"<div style=.white-space: nowrap; width: 80px; float: left;. class=.avb.>";
            Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
            MatchCollection matches;

            int count = 0;
            while (true)
            {
                string line = sr.ReadLine();
                if (line == null)
                    break;

                matches = regex.Matches(line);
                for (int j = 0; j < matches.Count; j++)
                {
                    line = sr.ReadLine();
                    liste.Add(line.Trim());

                    count++;
                }
            }
            return liste;
        }

        /// <summary>
        /// Finner antall mål på 'idag' og returnerer i en multivariabel liste
        /// </summary>
        /// <param name="page">siden for dagen som en string</param>
        /// <returns>Returnerer en liste i en liste med int's der første tallet er mål for lag 1 og andre tallet er mål for lag 2</returns>
        private List<List<int>> MaalIdag(string page)
        {
            List<List<int>> liste = new List<List<int>>();
            StringReader sr = new StringReader(page);

            string pattern = @"<a class='nifs_link' href=.kampfakta.php.kamp_id=.*&amp;t=.*&amp;u=.*&amp;land=.*&amp;lag1=.*&amp;lag2=.*>(.*)-(.*)";
            Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
            MatchCollection matches;

            int count = 0;
            while (true)
            {
                string line = sr.ReadLine();
                if (line == null)
                    break;

                matches = regex.Matches(line);
                for (int j = 0; j < matches.Count; j++)
                {
                    liste.Add(new List<int>());

                    int maal1 = Int32.Parse(matches[j].Groups[1].Value.Trim().ToString());
                    int maal2 = Int32.Parse(matches[j].Groups[2].Value.Trim().ToString());

                    liste[count].Add(maal1);
                    liste[count].Add(maal2);
                    count++;
                }
            }

            return liste;
        }

        /// <summary>
        /// Filtrerer ut lagene i en 'idag'-side fra nifs.
        /// </summary>
        /// <param name="page">Siden 'idag' på nifs</param>
        /// <returns>Returnerer en liste som inneholder en liste med lagnavn"</returns>
        private List<List<string>> KamperIdagLag(string page)
        {
            List<List<string>> liste = new List<List<string>>();
            MatchCollection matches;
            Regex regex = null;
            StringReader sr = new StringReader(page);

            string patternEasy = @"<a class='nifs_link' href=.head2head\.php\?land=.*&amp;t=.*&amp;u=.*&amp;lag1=.*&amp;lag2=.*>(?<lag1>.*) - (?<lag2>.*)</a>";
            string patternHard = @"<a class='nifs_link' href=.head2head\.php\?land=.*&amp;t=.*&amp;u=.*&amp;lag1=.*&amp;lag2=.*>(?<lag1>[\w\s&#;/]+)<img height=.11.*- (?<lag2>[\w\s&#;/]+)<img height=.11.*</a>";
            string pattern = patternEasy;
            
            int count = 0;
            while (true)
            {
                string line = sr.ReadLine();
                if (line == null)
                    break;
            
                // Utfør sjekk for å fastslå hvilket pattern som skal brukes
                if (line.Contains("alt=\"flagg\""))
                {
                    // Vanskelig linje
                    pattern = patternHard;
                }
                else
                {
                    // Enkel linje
                    pattern = patternEasy;
                }

                regex = new Regex(pattern, RegexOptions.IgnoreCase);
                
                matches = regex.Matches(line);
                for (int j = 0; j < matches.Count; j++)
                {
                    liste.Add(new List<string>());
                    liste[count].Add(matches[j].Groups["lag1"].Value);
                    liste[count].Add(matches[j].Groups["lag2"].Value);
                    count++;
                }
            }

            // Fjern mellomrom før og etter alle stringer lagnavn
            for (int i = 0; i < liste.Count; i++)
            {
                for (int j = 0; j < liste[i].Count; j++)
                {
                    liste[i][j] = liste[i][j].Trim();
                }
            }
            
            return liste;
        }
    }
}
